package com.quick.develop.flowable.application;

import com.quick.develop.flowable.domain.rule.BpmProcessRule;
import com.quick.develop.flowable.domain.vo.system.SysApiRole;
import org.flowable.variable.api.delegate.VariableScope;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author junyuan.liu
 * @description:  人员相关
 * @date 2022/5/26 14:13
 */
public interface IBpmTaskAssigneeApplication {
    /**
     * @description 获取规则配置里面的人 任务监听里面用
     * @param processInstanceId 流程实例ID
     * @param rule 规则
     * @return java.util.Set<java.lang.String>
     * @author junyuan.liu
     * @date 2022/5/26 18:57
     */
    Set<String> calculateTaskCandidateUsers(String processInstanceId, BpmProcessRule rule, VariableScope variable);
    
    /**
     * @description 获取人名  格式为：userName
     * @param userCode 员工号
     * @return java.lang.String
     * @author junyuan.liu
     * @date 2022/8/9 13:46
     */
    String getUserNameByUserCode(String userCode);

    /**
     * @description 通过用户编码集合获取用户名  【userCode】userName
     * @param userCodes 用户编码集合
     * @return java.util.Map<java.lang.String,java.lang.String>
     * @author junyuan.liu
     * @date 2022/8/11 18:22
     */
    Map<String, String> getUsersNameByUserCode(Collection<String> userCodes);

    /**
     * @description 通过用户编码集合获取用户名  userName
     * @param userCodes 用户编码集合
     * @return java.util.Map<java.lang.String,java.lang.String>
     * @author junyuan.liu
     * @date 2022/10/15 13:16
     */
    Map<String, String> getUsersRealNameByUserCode(Collection<String> userCodes);

    /**
     * @description 获取人员公司
     * @param userCode 用户编码
     * @return java.lang.String
     * @author junyuan.liu
     * @date 2022/8/16 14:01
     */
    String getUserProject(String userCode);

    /**
     * @description 查找角色
     * @param userCode 用户编码
     * @return java.util.List<com.quick.develop.system.api.domain.SysApiRole>
     * @author junyuan.liu
     * @date 2022/8/17 9:32
     */
    List<SysApiRole> getUserRoles(String userCode);

    /**
     * @description 获取任务候选组中的人
     * @param map <taskId, roleIds>
     * @return java.util.Map<java.lang.String,java.util.Set<java.lang.String>>
     * @author junyuan.liu
     * @date 2022/8/25 19:42
     */
    Map<String, Set<String>> getTaskCandidateUserByRoleId(Map<String, Set<String>> map);

    /**
     * @description 获取任务候选组人员名称 【userCode】userName
     * @param taskRoleMap <taskId, roleIds>
     * @return java.util.Map<java.lang.String,java.util.Set<java.lang.String>>
     * @author junyuan.liu
     * @date 2022/8/26 10:38
     */
    Map<String, Set<String>> getTaskCandidateUserNameStr(Map<String, Set<String>> taskRoleMap);

    /**
     * @description 判断人员是否在某个部门里面 返回存在的人员信息
     * @param deptId 部门ID
     * @param userCodes 人员集合
     * @return java.util.Set<java.lang.String>
     * @author junyuan.liu
     * @date 2022/8/29 16:44
     */
    Set<String> checkUserDept(Long deptId, Collection<String> userCodes);

    /**
     * @description 获取公司领导人员
     *
     * @return java.util.Set<java.lang.String>
     * @author junyuan.liu
     * @date 2022/8/30 13:37
     */
    Set<String> getLeaderUsers();


    Set<String> calculateTaskCandidateUsersByDeptMember(Set<String> optionsDept);

    Set<String> calculateTaskCandidateUsersByRole(Set<String> optionsRole);
}
